/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.seguranca.dao;

import br.uniceub.fsw.arquitetura.persistencia.dao.BaseDAO;
import br.uniceub.fsw.arquitetura.persistencia.dao.ConstrutorSQL;
import br.uniceub.fsw.seguranca.vo.GrupoVO;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * Data Access Object - Usuário
 * Camada de acesso ao banco de dados da entidade Usuário.
 * 
 * @author Bruno Schifer Bernardi
 */
public class GrupoDAO extends BaseDAO<GrupoVO> {
    
    @Override
    public void inserir(GrupoVO entidade) {
        ConstrutorSQL sql = new ConstrutorSQL();
        
        sql.append("INSERT INTO TB_GRUPO(NO_GRUPO)");
        sql.append("VALUES (?)");
        
        List<?> parametros = criarParametros(entidade.getNoGrupo());
        
        Integer idGerado = ((Long) executarInsercao(sql.toString(), parametros)).intValue();

        entidade.setIdGrupo(idGerado);
    }
    
    @Override
    public void alterar(GrupoVO entidade) {
        ConstrutorSQL sql = new ConstrutorSQL();
        
        sql.append("UPDATE TB_GRUPO SET NO_GRUPO = ?");
        sql.append("WHERE ID_GRUPO = ?");
        
        executarAlteracao(sql.toString(), criarParametros(entidade.getNoGrupo(), entidade.getIdGrupo()));
    }
    
    @Override
    public void excluir(GrupoVO entidade) {
        ConstrutorSQL sql = new ConstrutorSQL();
        
        sql.append("DELETE FROM TB_GRUPO");
        sql.append("WHERE ID_GRUPO = ?");
        
        executarAlteracao(sql.toString(), criarParametros(entidade.getIdGrupo()));
    }
    
    @Override
    public GrupoVO consultarPorId(Serializable id) {
        ConstrutorSQL sql = new ConstrutorSQL();
                
        sql.append("SELECT * FROM TB_GRUPO WHERE ID_GRUPO = ?");

        return consultarUm(sql.toString(), criarParametros(id));
    }
    
    @Override
    public List<GrupoVO> consultarPorExemplo(GrupoVO exemplo) {

        List<GrupoVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_GRUPO T WHERE 1=1");

        mapearQueryParaExemplo(query, exemplo);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;

    }

    /**
     * Recupera um grupo pelo nome.
     * 
     * @param noGrupo Nome do grupo.
     * @return Objeto grupo.
     */
    public GrupoVO consultarUmPorNome(String noGrupo) {
        ConstrutorSQL sql = new ConstrutorSQL();
                
        sql.append("SELECT * FROM TB_GRUPO WHERE UPPER(NO_GRUPO) = ?");
        
        return consultarUm(sql.toString(), criarParametros(noGrupo));
    }

    public GrupoVO consultarUmPorIdDiferentePorNome(Integer idGrupo, String noGrupo) {
        ConstrutorSQL sql = new ConstrutorSQL();
                
        sql.append("SELECT * FROM TB_GRUPO WHERE ID_GRUPO <> ? AND UPPER(NO_GRUPO) = ?");
        
        return consultarUm(sql.toString(), criarParametros(idGrupo, noGrupo));
    }

    /**
     * Recupera uma lista completa de grupos ordenada pelo nome
     * 
     * @return lista de grupos
     */
    public List<GrupoVO> consultarGruposOrdenadoPorNome() {
        ConstrutorSQL sql = new ConstrutorSQL();
        
        sql.append("SELECT *");
        sql.append("FROM TB_GRUPO A");
        sql.append("ORDER BY NO_GRUPO ASC");
        
        return consultar(sql.toString());
    }


    @Override
    protected GrupoVO extrairObjetoResultado(ResultSet rs) throws SQLException {

        GrupoVO grupo = new GrupoVO();
        grupo.setIdGrupo(rs.getInt("ID_GRUPO"));
        grupo.setNoGrupo(rs.getString("NO_GRUPO"));

        return grupo;
    }
    
    @Override
    protected void mapearQueryParaExemplo(ConstrutorSQL query, GrupoVO exemplo) {

        if (exemplo.getNoGrupo() != null && !exemplo.getNoGrupo().isEmpty()) {
            query.append("AND T.NO_GRUPO LIKE ?");
            adicionarParametro("%" + exemplo.getNoGrupo() + "%");
        }

    }
}
